home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xarchie-2.0.9
/
saveload.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-18
|
8KB
|
281 lines
/*
* saveload.c : Device-independent routines for writing (ie printing),
* saving, and restoring the browser contents.
*
* George Ferguson, ferguson@cs.rochester.edu, 23 Apr 1993.
*/
#include <stdio.h>
#include "sysdefs.h"
#include "stringdefs.h"
#include "pfs.h"
#include "pprot.h"
#include "xtypes.h"
#include "db.h"
#include "query.h"
#include "browser.h"
#include "settings.h"
#include "types.h"
#include "appres.h"
#include "alert.h"
#include "status.h"
/*
* Functions defined here
*/
int save(),load(),writeToFile();
static void writeEntry(),saveEntry();
/* - - - - - - - - */
/*
* Save browser contents to FILENAME for later load.
*/
int
save(db,filename)
DbEntry *db;
char *filename;
{
FILE *fp;
DbEntry *hostp,*locp,*filep;
if ((fp=fopen(filename,"w")) == NULL) {
alert1("Can't open %s for writing",filename);
return(0);
}
status1("Saving to %s...",filename);
/* Save the settinsg first */
fprintf(fp,"archieHost: %s\n",appResources.archieHost);
fprintf(fp,"searchType: %s\n",searchTypeToString(appResources.searchType));
fprintf(fp,"sortType: %s\n",sortTypeToString(appResources.sortType));
fprintf(fp,"niceLevel: %d\n",appResources.niceLevel);
fprintf(fp,"maxHits: %d\n",appResources.maxHits);
fprintf(fp,"timeout: %d\n",appResources.timeout);
fprintf(fp,"retries: %d\n",appResources.retries);
/* Now dump the browser */
for (hostp=db->entries; hostp != NULL; hostp = hostp->next)
for (locp=hostp->entries; locp != NULL; locp = locp->next)
for (filep=locp->entries; filep != NULL; filep=filep->next)
saveEntry(fp,filep);
fclose(fp);
status0("Ready");
return(1);
}
static void
saveEntry(fp,dbp)
FILE *fp;
DbEntry *dbp;
{
VLINK vl;
DbEntry *entry;
/* Sanity check */
if ((vl=dbp->vlink) == NULL) {
fprintf(stderr,"NULL vlink to save()\n");
return;
}
/* Save the vlink info */
fprintf(fp,"LINK %c %s '%s' %s %s %s %s %d %d ", vl->linktype,
vl->type, vl->name, vl->hosttype, vl->host,
vl->nametype, vl->filename, vl->version,
vl->f_magic_no);
/* And the relevant attributes */
fprintf(fp,"%d ",dbp->size);
fprintf(fp,"%s ",dbp->modes);
fprintf(fp,"%s",dbp->gt_date);
#ifdef undef
/* When we didn't keep gt_date (now needed for sorting), we used this: */
for (ap = vl->lattrib; ap; ap = ap->next)
if (strcmp(ap->aname,"LAST-MODIFIED") == 0)
fprintf(fp,"%s",ap->value.ascii);
#endif
fprintf(fp,"\n");
/* Recursively save the sub-entries */
for (entry=dbp->entries; entry != NULL; entry=entry->next)
saveEntry(fp,entry);
}
/*
* Load browser from FILENAME made by save.
*/
int
load(db,filename)
DbEntry *db;
char *filename;
{
FILE *fp;
char buf[256];
VLINK first_link,last_link,cur_link;
PATTRIB cur_at;
char l_linktype;
char l_name[MAX_DIR_LINESIZE];
char l_type[MAX_DIR_LINESIZE];
char l_htype[MAX_DIR_LINESIZE];
char l_host[MAX_DIR_LINESIZE];
char l_ntype[MAX_DIR_LINESIZE];
char l_fname[MAX_DIR_LINESIZE];
int tmp;
if ((fp=fopen(filename,"r")) == NULL) {
alert1("Can't open %s for reading",filename);
return(0);
}
status1("Loading from %s...",filename);
/* Load the settings */
if (fscanf(fp,"archieHost: %s\n",appResources.archieHost) < 1 ||
fscanf(fp,"searchType: %s\n",buf) < 1 ||
(appResources.searchType=stringToSearchType(buf)) == GfError ||
fscanf(fp,"sortType: %s\n",buf) < 1 ||
(appResources.sortType=stringToSortType(buf)) == GfError ||
fscanf(fp,"niceLevel: %d\n",&(appResources.niceLevel)) < 1 ||
fscanf(fp,"maxHits: %d\n",&(appResources.maxHits)) < 1 ||
fscanf(fp,"timeout: %d\n",&(appResources.timeout)) < 1 ||
fscanf(fp,"retries: %d\n",&(appResources.retries)) < 1) {
fclose(fp);
alert1("Error in header of file \"%s\"!",filename);
return(0);
} else {
reinitSettings();
}
/* Load the browser */
first_link = last_link = NULL;
while (!feof(fp)) {
/* Get a new vlink */
cur_link = vlalloc();
/* Read the vlink fields */
tmp = fscanf(fp,"LINK %c %s %s %s %s %s %s %d %d", &l_linktype,
l_type, l_name, l_htype, l_host,
l_ntype, l_fname, &(cur_link->version),
&(cur_link->f_magic_no));
if (tmp != 9) {
alert1("Load error in file %s!",filename);
vlfree(cur_link);
break;
}
/* Store data in vlink */
cur_link->linktype = l_linktype;
cur_link->type = stcopyr(l_type,cur_link->type);
cur_link->name = stcopyr(unquote(l_name),cur_link->name);
cur_link->hosttype = stcopyr(l_htype,cur_link->hosttype);
cur_link->host = stcopyr(l_host,cur_link->host);
cur_link->nametype = stcopyr(l_ntype,cur_link->nametype);
cur_link->filename = stcopyr(l_fname,cur_link->filename);
/* Add vlink to chain */
if (first_link == NULL) {
last_link = first_link = cur_link;
cur_link->next = cur_link->previous = NULL;
} else {
last_link->next = cur_link;
cur_link->previous = last_link;
cur_link->next = NULL;
last_link = cur_link;
}
/* Read the attributes */
tmp = fscanf(fp,"%s %s %s\n",l_name,l_type,l_htype);
if (tmp != 3) {
alert1("Load error in file %s!",filename);
break;
}
/* Put them in the vlink's attribute list */
cur_link->lattrib = cur_at = atalloc();
cur_at->aname = stcopyr("SIZE",cur_at->aname);
cur_at->avtype = stcopyr("ASCII",cur_at->avtype);
cur_at->value.ascii = stcopyr(l_name,cur_at->value.ascii);
cur_at->next = atalloc();
cur_at->next->previous = cur_at;
cur_at = cur_at->next;
cur_at->aname = stcopyr("UNIX-MODES",cur_at->aname);
cur_at->avtype = stcopyr("ASCII",cur_at->avtype);
cur_at->value.ascii = stcopyr(l_type,cur_at->value.ascii);
cur_at->next = atalloc();
cur_at->next->previous = cur_at;
cur_at = cur_at->next;
cur_at->aname = stcopyr("LAST-MODIFIED",cur_at->aname);
cur_at->avtype = stcopyr("ASCII",cur_at->avtype);
cur_at->value.ascii = stcopyr(l_htype,cur_at->value.ascii);
}
fclose(fp);
if (first_link == NULL) {
status0("No entries loaded!");
return(0);
}
status0("Parsing...");
resetBrowser();
clearEntries(db);
tmp = parseArchieQueryResults(db,first_link,NULL);
displayEntries(db,0);
status2("Loaded %d entries from \"%s\"",(char *)tmp,filename);
return(1);
}
/* - - - - - - - - */
/*
* Write browser contents to FILENAME. If ONELINE is True, each entry gets
* whole line.
*/
int
writeToFile(db,filename,oneline)
DbEntry *db;
char *filename;
int oneline;
{
FILE *fp;
DbEntry *hostp,*locp,*filep;
char *prefix;
if ((fp=fopen(filename,"w")) == NULL) {
alert1("Can't open %s for writing",filename);
return(0);
}
status1("Writing to %s...",filename);
if (oneline) {
for (hostp=db->entries; hostp != NULL; hostp = hostp->next)
for (locp=hostp->entries; locp != NULL; locp = locp->next)
for (filep=locp->entries; filep != NULL; filep=filep->next) {
prefix = malloc(strlen(hostp->name)+strlen(locp->name)+3);
sprintf(prefix,"%s:%s/",hostp->name,locp->name);
writeEntry(fp,filep,oneline,prefix);
free(prefix);
}
} else {
for (hostp=db->entries; hostp != NULL; hostp = hostp->next) {
fprintf(fp,"%s\n",hostp->name);
for (locp=hostp->entries; locp != NULL; locp = locp->next) {
fprintf(fp,"\t%s\n",locp->name);
for (filep=locp->entries; filep != NULL; filep=filep->next)
writeEntry(fp,filep,oneline,"");
}
}
}
fclose(fp);
status0("Ready");
return(1);
}
static void
writeEntry(fp,filep,oneline,prefix)
FILE *fp;
DbEntry *filep;
int oneline;
char *prefix;
{
DbEntry *entry;
char *newprefix;
/* Write this entry */
if (oneline) {
fprintf(fp,"%s %10d %12s %s%s\n",
filep->modes,filep->size,filep->date,prefix,filep->name);
} else {
fprintf(fp,"\t\t%s %10d %12s %s%s\n",
filep->modes,filep->size,filep->date,prefix,filep->name);
}
/* Add this entry to the prefix */
newprefix = malloc(strlen(prefix)+strlen(filep->name)+2);
sprintf(newprefix,"%s%s/",prefix,filep->name);
/* Recursively write the sub-entries */
for (entry=filep->entries; entry != NULL; entry=entry->next)
writeEntry(fp,entry,oneline,newprefix);
free(newprefix);
}